package es.udc.fbellas.j2ee.tiendaweb.model.productofacade.plain.actions;

import java.sql.Connection;
import java.util.Calendar;
import java.util.Date;

import javax.sql.DataSource;

import es.udc.fbellas.j2ee.tiendaweb.model.carrito.Carrito;
import es.udc.fbellas.j2ee.tiendaweb.model.carrito.LineaCarrito;
import es.udc.fbellas.j2ee.tiendaweb.model.detallespedido.DAO.SQLDetallesPedidoDAO;
import es.udc.fbellas.j2ee.tiendaweb.model.detallespedido.DAO.SQLDetallesPedidoDAOFactory;
import es.udc.fbellas.j2ee.tiendaweb.model.detallespedido.TO.DetallesPedidoTO;
import es.udc.fbellas.j2ee.tiendaweb.model.direccionpostal.DAO.SQLDireccionPostalDAO;
import es.udc.fbellas.j2ee.tiendaweb.model.direccionpostal.DAO.SQLDireccionPostalDAOFactory;
import es.udc.fbellas.j2ee.tiendaweb.model.direccionpostal.TO.DireccionPostalTO;
import es.udc.fbellas.j2ee.tiendaweb.model.lineapedido.DAO.SQLLineaPedidoDAO;
import es.udc.fbellas.j2ee.tiendaweb.model.lineapedido.DAO.SQLLineaPedidoDAOFactory;
import es.udc.fbellas.j2ee.tiendaweb.model.lineapedido.TO.LineaPedidoTO;
import es.udc.fbellas.j2ee.tiendaweb.model.tarjetabancaria.DAO.SQLTarjetaBancariaDAO;
import es.udc.fbellas.j2ee.tiendaweb.model.tarjetabancaria.DAO.SQLTarjetaBancariaDAOFactory;
import es.udc.fbellas.j2ee.tiendaweb.model.tarjetabancaria.TO.TarjetaBancariaTO;
import es.udc.fbellas.j2ee.tiendaweb.model.usuario.DAO.SQLUsuarioProfileDAO;
import es.udc.fbellas.j2ee.tiendaweb.model.usuario.DAO.SQLUsuarioProfileDAOFactory;
import es.udc.fbellas.j2ee.tiendaweb.model.usuario.TO.UsuarioProfileTO;
import es.udc.fbellas.j2ee.util.exceptions.DuplicateInstanceException;
import es.udc.fbellas.j2ee.util.exceptions.InternalErrorException;
import es.udc.fbellas.j2ee.util.sql.GeneralOperations;
import es.udc.fbellas.j2ee.util.sql.SimpleDataSource;
import es.udc.fbellas.j2ee.util.sql.TransactionalPlainAction;

public class ComprarProductosAction implements TransactionalPlainAction{

	private Carrito carrito;
	private TarjetaBancariaTO tarjetaNueva;
	private DireccionPostalTO dirNueva;
	//private PedidoTO pedido;
	
	public ComprarProductosAction(Carrito carrito, DireccionPostalTO dir, TarjetaBancariaTO tarjeta) {

		this.carrito=carrito;
		this.dirNueva=dir;
		this.tarjetaNueva=tarjeta;
	}


 public Object execute(Connection connection) 
     throws InternalErrorException,DuplicateInstanceException{

		int idPedido =0;

//		cojemos la fecha actual y la tenemos como Date de sql
		Calendar calendario= Calendar.getInstance();
		Date fechaTemp = calendario.getTime();
		java.sql.Date fecha= new java.sql.Date(fechaTemp.getTime());

//		cojemos los datos del usuario para obetener el idTarjeta y el idDir
		    	UsuarioProfileTO usuario = null;
				
		        try {        
		            
		            DataSource dataSource = new SimpleDataSource();
		            connection = dataSource.getConnection();        
		            SQLUsuarioProfileDAO dao1 = SQLUsuarioProfileDAOFactory.getDAO();
					usuario = dao1.find(connection,carrito.getLogin());
					
					SQLDireccionPostalDAO dirPostalDAO = SQLDireccionPostalDAOFactory.getDAO();

					DireccionPostalTO dirPostalPersonal = dirPostalDAO.find(connection, usuario.getIdDir());
					
					SQLTarjetaBancariaDAO tarjetaDAO = SQLTarjetaBancariaDAOFactory.getDAO();
					
					TarjetaBancariaTO tarjetaPersonal = tarjetaDAO.find(connection, usuario.getNumTarjeta());
					
					if(!dirNueva.equals(dirPostalPersonal)) dirPostalPersonal= dirPostalDAO.create(connection, dirNueva);
					if(!tarjetaNueva.equals(tarjetaPersonal)){
						System.out.println("Las tarjetas no son iguales");
						if(!tarjetaDAO.exists(connection, tarjetaNueva.getNumTarjeta()))
							tarjetaPersonal=tarjetaDAO.create(connection, tarjetaNueva);
						else throw new DuplicateInstanceException(tarjetaNueva.getNumTarjeta(),TarjetaBancariaTO.class.getName());
					}
		            
//		        } catch (Exception e) {
//		            e.printStackTrace();
//		        } finally {
//		            try {
//		                GeneralOperations.closeConnection(connection);
//					} catch (InternalErrorException k){
//						k.printStackTrace();
//					}
//		        }
		        

//		creamos los detalles del pedido en la base de datos   
//		        try {        
		           SQLDetallesPedidoDAO dao = SQLDetallesPedidoDAOFactory.getDAO();

		            DetallesPedidoTO detallesTO = new DetallesPedidoTO(0,fecha,tarjetaPersonal.getNumTarjeta(),"PENDIENTE",carrito.getLogin(),dirPostalPersonal.getIdDir());
		            detallesTO = dao.create(connection, detallesTO);
					System.out.println("el id de los detalles es: "+ detallesTO.getIdPedido());
		            idPedido=detallesTO.getIdPedido();
		            //pedido.setIdPedido(detallesTO.getIdPedido());
		            //pedido.setDetalles(detallesTO);
					
		            SQLLineaPedidoDAO daoLinea = SQLLineaPedidoDAOFactory.getDAO();
					for(int i=0;i<carrito.visualizaCarrito().size();i++){
						LineaCarrito lTemp = (LineaCarrito) carrito.visualizaCarrito().get(i);
						//lTemp.creaLineaPedido(idPedido);
						
						LineaPedidoTO lineaTO = new LineaPedidoTO(idPedido,0,lTemp.getNumUnidades(),lTemp.getDatosProducto(lTemp.getIdProducto()).getPrecio(),"PENDIENTE",lTemp.getIdProducto());
						lineaTO = daoLinea.create(connection, lineaTO);
					}
					carrito.borraCarrito();
					return detallesTO;
					
		        } catch (DuplicateInstanceException e) {
		            //e.printStackTrace();
		        	throw new DuplicateInstanceException(null,null);
		        } finally {
		            try {
		                GeneralOperations.closeConnection(connection);
		            } catch (InternalErrorException e) {
		                //e.printStackTrace();
		            	throw new InternalErrorException(e);
		            }
	                return null;
		        }          
		    
		}

}
